明白 JavaScript 是一個函數式語言是成為 JS 忍者的重要一步,函式除了無所不在,函式也為重要的模組化單元。函式使用發生在不同的事件場景,包含瀏覽器事件及其生命週期、網路事件(Ajax)、使用者事件(click)、
計時器事件等等,而函數可被呼叫,呼叫執行往往是非同步。後面還會講到更細部的事件迴圈,理解這些複雜的函式是如何運作的,但就先從宣告開始吧。
const obj = {}
obj.foo = function () {
}
function foo(callback) {
return callback()
}
這裡的 callback 指的是,我們先設定好某函式,但之後才會被呼叫。
function Foo () {
this.ninja = function {
return this;
};
}
//一般函式
function foo ( ) {
statements
}
//透過樣本字面產生
const foo = function () {
statements
}
//物件方法
const obj = () => {
foo: function () {
statements
}
}
//立即函式
(function () {
statements
})();
//生成器函式
function* name([param[, param[, ... param]]]) {
statements
}
//箭頭函式
const foo = () => {
statements
}
const obj = () => {
foo = () => {
statements
}
}
(() => {
statements
})();
//函式建構式
function Foo() {
this.inner = function() {
return this
}
}
//Function 建構函式
let foo = new Function('a', 'b', 'return a + b');
function outer () {
var a = 1;
console.log(inner1())
console.log(inner2())
function inner1(){
return "I am inner1"
}
var inner2 = function () {
return "I am inner2"
}
var b = 2;
if(a == 1) {
var c = 3;
}
}
outer()
為什麼 inner1 會過,inner2 不會過呢? 直到函式結尾。而內部具名函式會被 hoisting,所以可以在 outter 以內的範圍任意使用。但變數僅 hoisting 宣告的部分,而不包含初始化(將值或匿名函式指派給變數的部分)。
No matter what the problem is, it's always a people problem.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions
https://developer.mozilla.org/zh-TW/docs/Glossary/Hoisting